package com.si.service;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.si.dao.EntityDao;
import com.si.util.Paging;

/**
 * 类名称：BaseService 
 * 类描述：
 * 创建人： 
 * 创建时间：
 * 修改人：
 * 修改时间： 
 * 修改备注：
 * 
 * @version 1.0.0
 */
@Service
public class BaseService<T> {
	@Autowired
	private EntityDao entityDao;
	
	/**
	 * 执行sql语句
	 * @param model
	 */
	public List<Object[]> createSqlQuery(String sql){
		return entityDao.createSqlQuery(sql);	
	}

	/**
	 * 根据QueryWhere条件查询数据，带有分页功能
	 * @param curPage
	 * @param pageSize
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public Paging<T> createCriteriaPaging(Integer curPage,Integer pageSize){
		Paging<T> paging=entityDao.createCriteriaPaging(initClass(), curPage, pageSize);
		return paging;
	}
	
	/**
	 * 根据Map条件查询数据，带有分页功能
	 * @param curPage
	 * @param pageSize
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public Paging<T> createQueryPaging(Map<String, Object> parameterMap, Map<String, Object> orderMap,Integer curPage,Integer pageSize){
		Paging<T> paging=entityDao.createQueryPaging(initClass(), parameterMap, orderMap,curPage, pageSize);
		return paging;
	}
	
	/**
	 * 根据条件查询数据
	 * @param model
	 */
	@SuppressWarnings("unchecked")
	public List<T> getAll(Map<String, Object> parameterMap, Map<String, Object> orderMap){
		List<T> list=entityDao.createCriteria(initClass(), parameterMap, orderMap);
		return list;
	}
	/**
	 * 不带条件查询所有数据
	 * @param model
	 */
	@SuppressWarnings("unchecked")
	public List<T> getAll(){
		List<T> list=entityDao.createCriteria(initClass());
		return list;
	}
	
	/**
	 * 通过id查询一个对象
	 * @param id Integer类型的主键id
	 */
	public Object getObjectById(final Integer id){
		Object object=null;
		if(id!=null){
			object=entityDao.getObjectById(initClass(), id);
		}else{
			try {
				object=initClass().newInstance();
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
			
		}
		return object;
	}
	
	/**
	 * 通过id查询一个对象
	 * @param id String类型的主键id
	 */
	public Object getObjectById(final String id){
		return entityDao.getObjectById(initClass(), id);
	}
	
	/**
	 * 
	 * @param model
	 */
	public Object saveOrUpdate(final Object  model) {
		return entityDao.saveOrUpdate(model);
	}
	
	/**
	 * 
	 * @param model
	 */
	public Object save(final Object model) {
		return entityDao.save(model);
	}
	
	/**
	 * 
	 * @param model
	 */
	public Object update(final Object model) {
		return entityDao.update(model);
	}
	
	/**
	 * 
	 * @param model
	 */
	public void delete(Object model){
		entityDao.delete(model);
	}
	
	@SuppressWarnings("unchecked")
	private Class< T > initClass(){
		Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
		 return entityClass;
	}
}
